/**
 * 验证工具函数
 */

/**
 * 验证手机号
 * @param phone 手机号
 * @returns 是否为有效手机号
 */
export const isValidPhone = (phone: string): boolean => {
    const reg = /^1[3-9]\d{9}$/
    return reg.test(phone)
}

/**
 * 验证邮箱
 * @param email 邮箱
 * @returns 是否为有效邮箱
 */
export const isValidEmail = (email: string): boolean => {
    const reg = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/
    return reg.test(email)
}

/**
 * 验证身份证号
 * @param idCard 身份证号
 * @returns 是否为有效身份证号
 */
export const isValidIdCard = (idCard: string): boolean => {
    const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
    return reg.test(idCard)
}

/**
 * 验证URL
 * @param url URL地址
 * @returns 是否为有效URL
 */
export const isValidUrl = (url: string): boolean => {
    try {
        new URL(url)
        return true
    } catch (e) {
        return false
    }
}

/**
 * 验证密码强度
 * @param password 密码
 * @param options 选项，默认要求至少包含数字和字母，长度至少为8
 * @returns 是否为强密码
 */
export const isStrongPassword = (
    password: string,
    options = {
        minLength: 8,
        requireLetter: true,
        requireNumber: true,
        requireSymbol: false,
        requireUppercase: false,
        requireLowercase: false
    }
): boolean => {
    if (password.length < options.minLength) return false

    if (options.requireLetter && !/[a-zA-Z]/.test(password)) return false
    if (options.requireNumber && !/\d/.test(password)) return false
    if (options.requireSymbol && !/[!@#$%^&*(),.?":{}|<>]/.test(password)) return false
    if (options.requireUppercase && !/[A-Z]/.test(password)) return false
    if (options.requireLowercase && !/[a-z]/.test(password)) return false

    return true
}

/**
 * 验证是否为空值
 * @param value 要验证的值
 * @returns 是否为空值（null、undefined、空字符串、空数组、空对象）
 */
export const isEmpty = (value: any): boolean => {
    if (value === null || value === undefined) return true
    if (typeof value === 'string' && value.trim() === '') return true
    if (Array.isArray(value) && value.length === 0) return true
    if (typeof value === 'object' && Object.keys(value).length === 0) return true

    return false
}
